package org.jeecg.modules.nurse_user_bill.service.impl;

import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Date;

//import com.baiwang.open.client.BWRestClient;
//import com.baiwang.open.client.IBWClient;
//import com.baiwang.open.client.login.BopLoginClient;
//import com.baiwang.open.client.login.BopLoginResponse;
//import com.baiwang.open.client.login.PasswordLoginClient;
//import com.baiwang.open.client.login.PasswordLoginConfig;
//import com.baiwang.open.entity.request.OutputInvoiceIssueRequest;
//import com.baiwang.open.entity.request.node.*;
//import com.baiwang.open.entity.response.OutputInvoiceIssueResponse;
//import com.baiwang.open.exception.BWOpenException;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

import java.net.HttpURLConnection;
import java.net.URL;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.jeecg.common.exception.JeecgBootException;
import org.jeecg.modules.nurse_cost_type.entity.NurseCostType;
import org.jeecg.modules.nurse_cost_type.service.INurseCostTypeService;
import org.jeecg.modules.nurse_goods_detail.entity.NurseGoodsDetail;
import org.jeecg.modules.nurse_goods_detail.service.INurseGoodsDetailService;
import org.jeecg.modules.nurse_user_bill.constant.NurseInvoiceConstant;
import org.jeecg.modules.nurse_user_bill.entity.NurseUserBill;
import org.jeecg.modules.nurse_user_bill.entity.NurseUserBillInvoice;
import org.jeecg.modules.nurse_user_bill.mapper.NurseUserBillInvoiceMapper;
import org.jeecg.modules.nurse_user_bill.service.INurseUserBillInvoiceService;
import org.jeecg.modules.nurse_user_bill.service.INurseUserBillService;
import org.jeecg.modules.nurse_user_bill.vo.OpenInvoiceRequest;
import org.jeecg.modules.nurse_user_orders.entity.NurseUserOrdersDetail;
import org.jeecg.modules.nurse_user_orders.service.INurseUserOrdersDetailService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.*;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;

import javax.imageio.ImageIO;

/**
 * @Description: 用户电子发票
 * @Author: jeecg-boot
 * @Date: 2024-06-04
 * @Version: V1.0
 */
@Service
public class NurseUserBillInvoiceServiceImpl extends ServiceImpl<NurseUserBillInvoiceMapper, NurseUserBillInvoice> implements INurseUserBillInvoiceService {

    // 百望云开放平台环境地址
    @Value("${baiwangyun.nurse.url:}")
    public String url;
    // 百望云开放平台沙箱环境 appKey
    @Value("${baiwangyun.nurse.appKey:}")
    public String appKey;
    // 百望云沙箱环境 用户名
    @Value("${baiwangyun.nurse.userName:}")
    public String userName;
    // 百望云沙箱环境 密码
    @Value("${baiwangyun.nurse.password:}")
    public String password;
    // 百望云沙箱环境 appSecret
    @Value("${baiwangyun.nurse.appSecret:}")
    public String appSecret;
    // 百望云沙箱环境 用户盐值
    @Value("${baiwangyun.nurse.userSalt:}")
    public String userSalt;

    @Autowired
    private NurseUserBillInvoiceMapper nurseUserBillInvoiceMapper;

    @Autowired
    private INurseCostTypeService nurseCostTypeService;

    @Autowired
    private INurseUserOrdersDetailService nurseUserOrdersDetailService;

    @Autowired
    private INurseGoodsDetailService nurseGoodsDetailService;

    @Autowired
    private INurseUserBillService nurseUserBillService;


    @Override
    public List<NurseUserBillInvoice> selectByMainId(String mainId) {
        return nurseUserBillInvoiceMapper.selectByMainId(mainId);
    }

    @Override
    public String openElectronicInvoice(OpenInvoiceRequest invoiceResponseRequest) {
//		try {
//			// 根据orderId查询订单详情
//			QueryWrapper queryWrapper = new QueryWrapper();
//			queryWrapper.eq("order_id", invoiceResponseRequest.getOrderId());
//			NurseUserOrdersDetail ordersDetail = nurseUserOrdersDetailService.getOne(queryWrapper);
//
//			if(ordersDetail == null){
//				throw new JeecgBootException("订单ID不正确，请检查");
//			}
//
//			// 根据orderId获取商品详情，商品详情表可以取到cost_type，根据cost_type可以查到商品费用类型表；
//			QueryWrapper nurseGoodsDetailQueryWrapper = new QueryWrapper();
//			nurseGoodsDetailQueryWrapper.eq("goods_id", ordersDetail.getGoodsId());
//			NurseGoodsDetail nurseGoodsDetail = nurseGoodsDetailService.getOne(nurseGoodsDetailQueryWrapper);
//
//			if(nurseGoodsDetail == null){
//				throw new JeecgBootException("商品ID不正确，请检查");
//			}
//
//			// 查询商品费用类型
//			QueryWrapper nurseCostTypeQueryWrapper = new QueryWrapper();
//			nurseCostTypeQueryWrapper.eq("bill_code", nurseGoodsDetail.getBillCode());
//			NurseCostType costTypeServiceOne = nurseCostTypeService.getOne(nurseCostTypeQueryWrapper);
//
//			if(nurseGoodsDetail == null){
//				throw new JeecgBootException("查询商品费用类型失败，请检查");
//			}
//
//			// 税率
//			BigDecimal taxRate = costTypeServiceOne.getTaxRate();
//			// 商品名称
//			String billName = costTypeServiceOne.getBillName();
//			// 是否含税
//			Integer isTax = costTypeServiceOne.getTaxBoolean();
//
//			// 查询账单
//			QueryWrapper nurseUserBillQueryWrapper = new QueryWrapper();
//			nurseUserBillQueryWrapper.eq("order_id", ordersDetail.getOrderId());
//			NurseUserBill nurseUserBill = nurseUserBillService.getOne(nurseUserBillQueryWrapper);
//
//			if(nurseUserBill == null){
//				throw new JeecgBootException("查询账单失败，请检查");
//			}
//
//			// 开具电子发票
//			String requestId = UUID.randomUUID().toString(); //自定义请求唯一标识
//			PasswordLoginConfig loginConfig = new PasswordLoginConfig();
//			loginConfig.setUrl(url);
//			loginConfig.setClientId(appKey);
//			loginConfig.setClientSecret(appSecret);
//			loginConfig.setUsername(userName);
//			loginConfig.setPassword(password);
//			loginConfig.setUserSalt(userSalt);
//			BopLoginClient loginClient = new PasswordLoginClient(loginConfig);
//
//			// 获取token, token相关说明请参考 文档中心 -> 用户授权说明
//			BopLoginResponse loginResponse = loginClient.login();
//			// 重载方法，可以传自定义请求唯一标识
//			// BopLoginResponse loginResponse = loginClient.login(requestId);
//			String token = loginResponse.getResponse().getAccessToken();
//
//
//			OutputInvoiceIssueRequest request = new OutputInvoiceIssueRequest();
//			// 超过发票单张限额是否需要拆分开具，默认不拆分（拆分只支持发票类型代码为 专票 004 普票 007 电子票 026的发票）
//			request.setIsSplit(false);
//			// 是否返回蓝票已红冲红票信息，0否，1是，默认为0（仅支持税控发票）
//			request.setIsReturnRedInfo("0");
//			// 值为（1/0 1 需要补全 0不需要补全，默认为0）是否根据客户编码，购方税号，
//			// 购方名称查询客户信息补全未填写的购方信息（购方税号，购方名称，购方地址电话，购方银行账号，邮箱，手机）
//			request.setCompletionCustom("0");
//			OutputInvoiceIssuePreInvoice data = new OutputInvoiceIssuePreInvoice();
//			// 整单折扣率（数电发票暂不支持）,取值[1-100]正整数
//			//data.setDiscountRate(0);
//			// 红字信息表UUID，开具全电负数发票必传
//			// data.setRedConfirmUuid("");
//			// 购方开户行及账号， 增值税专用发票开具时必填，发票类型代码为01、02时该字段拆分为银行名称、账号两个字段
//			// data.setBuyerBankAccount("62266693991223881");
//			// 客户邮箱
//			if(NurseInvoiceConstant.EMAIL.equals(invoiceResponseRequest.getMode())
//					&& invoiceResponseRequest.getEmail() != null){
//				data.setBuyerEmail(invoiceResponseRequest.getEmail());
//			}
//			/*// todo: 合计税额， 保留两位小数；支持价税分离
//			data.setInvoiceTotalTax(BigDecimal.valueOf(1.3));
//			// todo 合计金额， 保留两位小数；支持价税分离
//			data.setInvoiceTotalPrice(BigDecimal.valueOf(1.0));
//			// todo 价税合计， 保留两位小数；支持价税分离
//			data.setInvoiceTotalPriceTax(BigDecimal.valueOf(11.3));*/
//
//			// 购方自然人标记Y:自然人； N:非自然人，默认为N
//			if(NurseInvoiceConstant.PERSONAL.equals(invoiceResponseRequest.getReceiveType())){
//				data.setBuyerNaturalPerson("Y");
//			} else {
//				data.setBuyerNaturalPerson("N");
//			}
//			// 整单折扣金额（数电发票暂不支持）,大于0小于发票总金额，如果是含税发票，大于0小于含税总金额
//			//data.setDiscountAmount(BigDecimal.valueOf(0.0));
//			// 证件类型，
//			// 201:居民身份证;208:外国护照;210:港澳居民来往内地通行证;213:台湾居民来往大陆通行证;215:外国人居留证;
//			// 219:香港永久性居民身份证;220:台湾身份证;221:澳门特别行政区永久性居民身份证;233:外国人永久居留身份证(外国人永久居留证);
//			// 103:税务登记证;299:其他个人证件，特殊票种标识为24时必填
//			// data.setCredentialsType("");
//			// 销方地址，发票类型代码为01、02时该字段可用
//			// data.setSellerAddress("");
//			// data.setChecker("\u674E\u4F73\u4F73");
//			// 复核人， 16个字符；税控开具时： 为空时，如果终端有值取终端，如果没有去机构获取，
//			// 红字信息表/确认单编号，仅invoiceType=1时需要传入数据 税控类红票开具时，invoiceTypeCode=004、028时必须传值，传入红字信息表编号；
//			// 全电类红票开具时，invoiceTypeCode=01、02时必须传值，传入红字确认单编号；
//			// data.setRedInfoNo("");
//			// 收款人， 16个字符；税控类开具时：若为空，如果终端有值取终端，如果没有去机构获取，若都没有则为空；
//			// 全电类开具时：此字段非必填，即发票类型代码为01，02时该字段非必填
//			// data.setPayee("");
//			// 减按征税标识，01：个人出租住房；03：销售自己使用过的固定资产；05：住房租赁。默认为空,空代表无。
//			// data.setReducedTaxCode("");
//			// 购买方地址，发票类型代码为01、02时该字段可用
//			if(invoiceResponseRequest.getAddress() != null && !"".equals(invoiceResponseRequest.getAddress())){
//				data.setBuyerAddress(invoiceResponseRequest.getAddress());
//			}
//			// 若都没有则为空！全电类开具时：此字段非必填，即发票类型代码为01，02时该字段非必填；
//			// data.setTaxationMethod("0");
//			// 差额征税标签：01 全额开票、 02 差额开票 ；发票类型代码为01，02时且征税方式为2 必填
//			// data.setTaxationLabel("01");
//			// 第三方系统名称
//			// data.setSystemName("");
//			/**
//			 * 开票类型 0:正数发票（蓝票） 1：负数发票（红票）默认0
//			 */
//			data.setInvoiceType("0");
//			// 红冲原因（1 销货退回 2 开票有误 3 服务终止 4 销售折让）税控红冲原因：
//			// 建议按实际开票情况传入红冲原因，若不传系统会自动根据情况判断并赋值；全电红冲原因：必填
//			// data.setRedIssueReason("");
//			// 购方地址和联系电话是否显示在备注，true：购方地址和联系电话显示在备注，false：购方地址和联系电话不显示在备注
//			data.setDisplayBuyerAddTel(false);
//			// 抄送人邮箱,多个用英文逗号隔开,最多5个抄送人信息 全电字符长度为200
//			// data.setEmailCarbonCopy("");
//			Map<String, Object> ext = new HashMap<String, Object>();
//			data.setExt(ext);
//			// 发票请求流水号
//			// data.setOrderNo("");
//			// 购方单位税号， invoiceTypeCode=004、028、01（增值税专用发票、增值税电子专用发票、全电发票（增值税专用发票））开具时必传
//			// invoiceSpecialMark=16|17（农产品收购、光伏收购）开具时必传
//			if(invoiceResponseRequest.getDutyParagraph() != null){
//				data.setBuyerTaxNo(invoiceResponseRequest.getDutyParagraph());
//			}
//
//			// 报废产品收购1%转3%放弃优惠开具理由，2：前期已开具3%征收率的发票，发生销售折让、中止或者退回等情形需要开具3%征收率的红字发票，
//			// 或者开票有误需要重新开具3%征收率的发票；3：因为实际经营业务需要，放弃享受减按1%征收率征收增值税政策:，不填时系统默认按3处理。
//			// data.setTaxReason("");
//			// 成品油单价过低是否确认开具标识：Y 是； N 否 为空时默认值为N
//			// （备注：专票单价过低强制开票会记入异常发票，红冲需要在电子税务局申请解除然后再红冲；普票单价过低开具成功发票可以正常红冲）
//			// data.setIsConfirmIssue("");
//			// 合同号
//			// data.setContractNumber("");
//			// 原发票号码， invoiceType=1，税控负数普票开具时必传；红票选数电票时，此项可为空。
//			// data.setOriginalInvoiceNo("");
//			// 0：无清单；1：带清单（专普票发票明细大于等于8行必须带清单）：
//			// 大于8行必须为清单票(电子票只能为非请单票)（默认是0无清单），发票类型代码为01，02时该字段无
//			// data.setInvoiceListMark("0");
//			/**
//			 * 必传 开票流水号， 唯一标志开票请求。支持数字字母下划线组合。
//			 * 使用订单ID来作为开票流水号
//			 */
//			if(invoiceResponseRequest.getOrderId() != null){
//				data.setSerialNo(invoiceResponseRequest.getOrderId());
//			} else {
//				throw new JeecgBootException("开票流水号为空！请检查");
//			}
//			// 凭证号
//			// data.setVoucherNo("");
//			// 销方开户行银行账号是否显示在备注。true：销方开户行银行账号显示在备注，
//			// 或者false：销方开户行银行账号不显示在备注
//			// data.setDisplaySeller(false);
//			// 客户电话
//			if(invoiceResponseRequest.getPhone() != null){
//				data.setBuyerPhone(invoiceResponseRequest.getPhone());
//			}
//			// 税局二次确认是否继续开票，1：是；0：否；（03建筑服务发票，建筑服务发生地和销方注册地址不同时是否继续开票,
//			// 24报废产品收购需要缴纳购置税的提示是否继续开具），若不传值，系统默认按照“是”处理;
//			// data.setConfirmIssue("1");
//			// 用户账号，用于个人维度数据标记
//			// data.setUserAccount("");
//			// List<OutputInvoiceIssueInvoiceDetail>, 商品明细节点
//			List<OutputInvoiceIssueInvoiceDetail> invoiceDetailsList = new ArrayList<OutputInvoiceIssueInvoiceDetail>();
//			OutputInvoiceIssueInvoiceDetail outputInvoiceIssueInvoiceDetail = new OutputInvoiceIssueInvoiceDetail();
//			Map<String, Object> ext1 = new HashMap<String, Object>();
//			outputInvoiceIssueInvoiceDetail.setExt(ext1);
//			// todo 税率,超长自动保留三位小数
//			outputInvoiceIssueInvoiceDetail.setGoodsTaxRate(taxRate);
//			// 发票行性质， 0：正常行；1：折扣行；2：被折扣行，默认为0
//			outputInvoiceIssueInvoiceDetail.setInvoiceLineNature("0");
//			/**
//			 * 必传 todo 金额，小数点后2位,超长自动保留两位小数
//			 */
//			outputInvoiceIssueInvoiceDetail.setGoodsTotalPrice(ordersDetail.getAmt());
//			// 是否使用优惠政策， 0：未使用；1：使用 根据商品信息获取
//			outputInvoiceIssueInvoiceDetail.setPreferentialMarkFlag("0");
//			// 商品编码，可以支持根据商品名称或商品编码进行获取【增加商品编码字段】：平台必须维护商品信息
//			// outputInvoiceIssueInvoiceDetail.setGoodsPersonalCode("");
//			// 对应蓝票明细行号 税控类红字发票开具时无需传值； 全电类红字发票开具时必须传值；
//			// outputInvoiceIssueInvoiceDetail.setOriginalInvoiceDetailNo("");
//			// 规格型号，如果特殊票种为03、09、05、06，字段填写无效；特殊票种为15和31时填写车架号/车辆识别号；
//			// outputInvoiceIssueInvoiceDetail.setGoodsSpecification("");
//			// 商品单价，最多允许17位（含小数点），小数点后最多允许13位，特殊票种为12时必填 乐企：单位、数量、单价应同时为空或同时不为空；
//			// rpa : 01 成品油发票 必填；如果特殊票种为03时，字段填写无效；特殊票种为稀土时，单价数量应该同时不为空。
//			// outputInvoiceIssueInvoiceDetail.setGoodsPrice(BigDecimal.valueOf(1.0));
//			// 零税率标识：空 代表不使用零税率； 1：出口免税和其他免税优惠政策； 2：不征增值税；3：普通零税率
//			// outputInvoiceIssueInvoiceDetail.setFreeTaxMark("");
//			// 明细行折扣金额,全电不支持该字段
//			// outputInvoiceIssueInvoiceDetail.setGoodsDiscountAmount(BigDecimal.valueOf(0.0));
//			// 商品数量，最多允许17位（含小数点和负号），小数点后最多允许13位，特殊票种为05（不动产销售服务发票）、06（不动产租赁服务发票）、
//			// 12（机动车）、01 （全电成品油发票）时必填；乐企：单位、数量、单价应同时为空或同时不为空；
//			// 如果特殊票种为03时，字段填写无效；特殊票种为稀土时，单价数量应该同时不为空。
//			// outputInvoiceIssueInvoiceDetail.setGoodsQuantity(BigDecimal.valueOf(10.0));
//			// 单位
//			//outputInvoiceIssueInvoiceDetail.setGoodsUnit("");
//			// 税额，小数点后2位,超长自动保留两位小数， 如果为空，根据金额、税率计算得出
//			// outputInvoiceIssueInvoiceDetail.setGoodsTotalTax(BigDecimal.valueOf(1.3));
//			// 税收分类编码（末级节点）
//			// outputInvoiceIssueInvoiceDetail.setGoodsCode("1010101070000000000");
//			// todo 商品名称，支持根据商品或商品编码获取商品信息：平台必须维护商品信息   ～～二选一必填
//			// 取商品费用类型的名称
//			outputInvoiceIssueInvoiceDetail.setGoodsName(billName);
//			// 必填 明细行号，第几行商品的意思？
//			outputInvoiceIssueInvoiceDetail.setGoodsLineNo(1);
//			// 优惠政策类型，preferentialMarkFlag=1，使用优惠政策时必传，如“免税”、“50%先征后退”、“即征即退50%”等
//			// outputInvoiceIssueInvoiceDetail.setVatSpecialManagement("");
//			invoiceDetailsList.add(outputInvoiceIssueInvoiceDetail);
//			// List<OutputInvoiceIssueInvoiceDetail>, 商品明细节点
//			data.setInvoiceDetailsList(invoiceDetailsList);
//			// 销方银行名称，发票类型代码为01、02时该字段可用
//			/*if(invoiceResponseRequest.getBankName() != null){
//				data.setSellerBankName(invoiceResponseRequest.getBankName());
//			}*/
//			// 购方开户行银行账号是否显示在备注，true：购方开户行银行账号显示在备注，或者false：购方开户行银行账号不显示在备注
//			data.setDisplayBuyer(false);
//			// 原发票代码， invoiceType=1，税控负数普票开具时必传；红票选数电票时，此项可为空。
//			// data.setOriginalInvoiceCode("");
//			// N：无共同购买方，Y：有公同购买方，传Y时共同购买方信息字段必填；不传默认按N处理；不支持乐企
//			// data.setMulPurchaserMark("");
//			// 销方电话，发票类型代码为01、02时该字段可用
//			// data.setSellerTelphone("");
//			// 选择纸质发票标志为Y时，纸票类型必填。票种为 普通发票02时可传： 04 2016版增值税普通发票（二联折叠票）， 05 2016版增值税普通发票（五联折叠票);
//			// 票种为 增值税专用发票01可传： 1130 增值税专用发票（中文三联无金额限制版） ，1140 增值税专用发票（中文四联无金额限制版） 1160 增值，
//			// 税专用发票（中文六联无金额限制版） ，1170 增值税专用发票（中文七联无金额限制版）
//			// data.setPaperInvoiceTypeCode("");
//			// 含税标志， 0：不含税；1：含税（默认不含税）
//			data.setPriceTaxMark(isTax.toString());
//			// 购买方电话，发票类型代码为01、02时该字段可用
//			if(invoiceResponseRequest.getPhone() != null){
//				data.setBuyerTelphone(invoiceResponseRequest.getPhone());
//			}
//			// 数电纸质发票标志，Y：是，N：否。税控类发票开具不校验此字段；暂只支持用数电电票红冲数电纸票
//			// data.setPaperInvoiceFlag("N");
//			// List<OutputInvoiceIssueInvoiceBalanceinfo>, 全电发票差额扣除额凭证明细，当征税方式为：差额征税-差额开票时必填
//			/*List<OutputInvoiceIssueInvoiceBalanceinfo> invoiceBalanceinfoList = new ArrayList<OutputInvoiceIssueInvoiceBalanceinfo>();
//			OutputInvoiceIssueInvoiceBalanceinfo outputInvoiceIssueInvoiceBalanceinfo = new OutputInvoiceIssueInvoiceBalanceinfo();
//			outputInvoiceIssueInvoiceBalanceinfo.setBalanceVoucherNo("");
//			outputInvoiceIssueInvoiceBalanceinfo.setBalanceType("01");
//			outputInvoiceIssueInvoiceBalanceinfo.setBalanceDeductAmount(BigDecimal.valueOf(10.0));
//			outputInvoiceIssueInvoiceBalanceinfo.setBalanceNo("1");
//			outputInvoiceIssueInvoiceBalanceinfo.setBalanceIssueDate("2023-01-22");
//			outputInvoiceIssueInvoiceBalanceinfo.setBalanceInvoiceNo("");
//			outputInvoiceIssueInvoiceBalanceinfo.setBalanceTotalAmount(BigDecimal.valueOf(20.0));
//			outputInvoiceIssueInvoiceBalanceinfo.setBalanceSource("0");
//			outputInvoiceIssueInvoiceBalanceinfo.setBalanceElectricNo("");
//			outputInvoiceIssueInvoiceBalanceinfo.setBalanceInvoiceCode("");
//			outputInvoiceIssueInvoiceBalanceinfo.setBalanceRemarks("\u5907\u6CE8");
//			invoiceBalanceinfoList.add(outputInvoiceIssueInvoiceBalanceinfo);
//			data.setInvoiceBalanceinfoList(invoiceBalanceinfoList);*/
//			// 销方地址和联系电话是否显示在备注，true：销方地址和联系电话显示在备注，false：销方地址和联系电话不显示在备注
//			data.setDisplaySellerAddTel(false);
//			// 卷式发票票样 01 02 03 04 05 06 07
//			// data.setMainGoodsName("");
//			// 销方地址及电话，发票类型代码为01、02时该字段拆分为地址、电话两个字段
//			// data.setSellerAddressPhone("");
//			// List<OutputInvoiceIssueCoPurchaseInfo>, 共同购买方标识传Y时共同购买方明细字段必填
//			/*List<OutputInvoiceIssueCoPurchaseInfo> mulPurchaserList = new ArrayList<OutputInvoiceIssueCoPurchaseInfo>();
//			OutputInvoiceIssueCoPurchaseInfo outputInvoiceIssueCoPurchaseInfo = new OutputInvoiceIssueCoPurchaseInfo();
//			outputInvoiceIssueCoPurchaseInfo.setPurchaser("");
//			outputInvoiceIssueCoPurchaseInfo.setCertificateNo("");
//			outputInvoiceIssueCoPurchaseInfo.setCertificateType("");
//			mulPurchaserList.add(outputInvoiceIssueCoPurchaseInfo);
//			data.setMulPurchaserList(mulPurchaserList);*/
//			// 购买方银行名称，发票类型代码为01、02时该字段可用
//			if(invoiceResponseRequest.getBankName() != null && !"".equals(invoiceResponseRequest.getBankName())){
//				data.setBuyerBankName(invoiceResponseRequest.getBankName());
//			}
//			if(invoiceResponseRequest.getBankAccount()  != null && !"".equals(invoiceResponseRequest.getBankAccount())){
//				data.setBuyerBankAccount(invoiceResponseRequest.getBankAccount());
//			}
//			if(invoiceResponseRequest.getAddress()  != null && !"".equals(invoiceResponseRequest.getAddress() )){
//				data.setBuyerAddress(invoiceResponseRequest.getAddress() );
//			}
//			if(invoiceResponseRequest.getPhone()  != null && !"".equals(invoiceResponseRequest.getPhone() )){
//				data.setBuyerPhone(invoiceResponseRequest.getPhone() );
//			}
//			// 整单折扣类型（数电发票暂不支持） 1 :按折扣金额价内折扣,2:按折扣金额价外折扣,3:按折扣率价内折扣,4:按折扣率价外折扣
//			// data.setDiscountType("");
//			// 购方地址及电话， 增值税专用发票开具时必填，发票类型代码为01、02时该字段拆分为地址电话两个字段
//			// data.setBuyerAddressPhone("\u5317\u4EAC\u5E02\u6D77\u6DC0\u533A 010-83332891");
//			// 第三方系统id
//			// data.setSystemId("");
//			// 扣除额， taxationLabel=2，差额征税时必传。数值必须小于价税合计。
//			// data.setDeductibleAmount(BigDecimal.valueOf(0.0));
//			// 	开票人，税票选填，取值逻辑：如果终端有值取终端，如果没有去机构获取，如果都没有会自动获取机构下随机用户名称；数电票Web连接器选填，
//			// 	取值逻辑：taxUserName＞drawer＞默认开票人＞终端授权开票人，如果以上四处都未取到随机获取该税号下最近一次登录的数电账号对应的开票人；
//			// 	数电票乐企连接器必填，长度最大300字符。
//			// data.setDrawer("\u5F20\u4E00\u8BFA");
//			// 特殊票种标志， 00：普通发票；01：农产品销售；02：农产品收购；08：成品油 机动车（默认是00普通发票）;
//			// 16矿产品；03稀土； 全电类发票特殊票种标志：01 成品油发票；03：建筑服务发票；04：货物运输服务发票；05：不动产销售服务发票；
//			// 06：不动产租赁服务发票；09：旅客运输发票；12：自产农产品销售；13：拖拉机和联合收割机；14：机动车；15：二手车；16：农产品收购；
//			// 31：二手车*；24：报废产品收购；02：稀土；17：光伏收购；07：代收车船税；32：电子烟；18卷烟
//			data.setInvoiceSpecialMark("00");
//			// 必传 购方单位名称 全电为100个字符
//			if(invoiceResponseRequest.getInvoiceHeader() != null
//					&& invoiceResponseRequest.getDutyParagraph() != null){
//				data.setBuyerName(invoiceResponseRequest.getInvoiceHeader());
//			}
//
//			// 销方银行账号，发票类型代码为01、02时该字段可用
//			// data.setSellerBankNumber("");
//			// 购买方银行账号，发票类型代码为01、02时该字段可用
//			if(invoiceResponseRequest.getBankAccount() != null){
//				data.setBuyerBankNumber(invoiceResponseRequest.getBankAccount());
//			}
//			// 销方开户行及账号，发票类型代码为01、02时不用此字段
//			// data.setSellerBankAccount("");
//			/**
//			 * 必填 发票类型代码, 004：增值税专用发票；007：增值税普通发票；026：增值税电子发票；
//			 * 025：增值税卷式发票；028:增值税电子专用发票 01:全电发票(增值税专用发票) 02:全电发票(普通发票)
//			 */
//			if(NurseInvoiceConstant.PERSONAL.equals(invoiceResponseRequest.getReceiveType())){
//				data.setInvoiceTypeCode("02");
//			} else {
//				data.setInvoiceTypeCode("01");
//			}
//			// List<OutputInvoiceIssueInvoiceSpecialInfo>, List, 特定业务信息节点，当特殊票种标志为03、04、05、06、07时必填；
//			// 当特殊票种标志为09时特定要素信息字段必须同时为空或同时不为空；
//			/*List<OutputInvoiceIssueInvoiceSpecialInfo> invoiceSpecialInfoList = new ArrayList<OutputInvoiceIssueInvoiceSpecialInfo>();
//			OutputInvoiceIssueInvoiceSpecialInfo outputInvoiceIssueInvoiceSpecialInfo = new OutputInvoiceIssueInvoiceSpecialInfo();
//			outputInvoiceIssueInvoiceSpecialInfo.setLeaseHoldDateEnd("");
//			outputInvoiceIssueInvoiceSpecialInfo.setPropertyContractNo("");
//			outputInvoiceIssueInvoiceSpecialInfo.setBuildingLocalAddress("");
//			outputInvoiceIssueInvoiceSpecialInfo.setPolicyNumber("");
//			outputInvoiceIssueInvoiceSpecialInfo.setBuildingCrossSign("");
//			outputInvoiceIssueInvoiceSpecialInfo.setCarriageDateYmd("");
//			outputInvoiceIssueInvoiceSpecialInfo.setTractorVehicleNo("");
//			outputInvoiceIssueInvoiceSpecialInfo.setPropertyCrossSign("");
//			outputInvoiceIssueInvoiceSpecialInfo.setTransport_tool_num("");
//			outputInvoiceIssueInvoiceSpecialInfo.setCarriageId("");
//			outputInvoiceIssueInvoiceSpecialInfo.setCarriageVehicleGrade("");
//			outputInvoiceIssueInvoiceSpecialInfo.setPropertyAddress("");
//			outputInvoiceIssueInvoiceSpecialInfo.setTractorRegistry("");
//			outputInvoiceIssueInvoiceSpecialInfo.setLeaseAreaUnit("");
//			outputInvoiceIssueInvoiceSpecialInfo.setCarriageName("");
//			outputInvoiceIssueInvoiceSpecialInfo.setVehicleCode("");
//			outputInvoiceIssueInvoiceSpecialInfo.setPropertyDetailAddress("");
//			outputInvoiceIssueInvoiceSpecialInfo.setTractorEngineNo("");
//			outputInvoiceIssueInvoiceSpecialInfo.setLeasePropertyNo("");
//			outputInvoiceIssueInvoiceSpecialInfo.setBuildingName("");
//			outputInvoiceIssueInvoiceSpecialInfo.setTotalAmount(BigDecimal.valueOf(0.0));
//			outputInvoiceIssueInvoiceSpecialInfo.setTransport_departure("");
//			outputInvoiceIssueInvoiceSpecialInfo.setLeaseDetailAddress("");
//			outputInvoiceIssueInvoiceSpecialInfo.setPropertyAreaUnit("");
//			outputInvoiceIssueInvoiceSpecialInfo.setTransport_tool_type("");
//			outputInvoiceIssueInvoiceSpecialInfo.setUsedCarNo("");
//			outputInvoiceIssueInvoiceSpecialInfo.setUsedCarCode("");
//			outputInvoiceIssueInvoiceSpecialInfo.setTaxPeriod("");
//			outputInvoiceIssueInvoiceSpecialInfo.setCarriageLeave("");
//			outputInvoiceIssueInvoiceSpecialInfo.setCarriageVehicleType("");
//			outputInvoiceIssueInvoiceSpecialInfo.setPropertyApprovedPrice(BigDecimal.valueOf(0.0));
//			outputInvoiceIssueInvoiceSpecialInfo.setLateFeeAmount(BigDecimal.valueOf(0.0));
//			outputInvoiceIssueInvoiceSpecialInfo.setCarriageArrive("");
//			outputInvoiceIssueInvoiceSpecialInfo.setBuildingDetailAddress("");
//			outputInvoiceIssueInvoiceSpecialInfo.setCarriageLeaveAddress("");
//			outputInvoiceIssueInvoiceSpecialInfo.setPropertyLandTaxNo("");
//			outputInvoiceIssueInvoiceSpecialInfo.setPropertyDealPrice(BigDecimal.valueOf(0.0));
//			outputInvoiceIssueInvoiceSpecialInfo.setUsedCarAllelectricNo("");
//			outputInvoiceIssueInvoiceSpecialInfo.setLeaseAddress("");
//			outputInvoiceIssueInvoiceSpecialInfo.setPropertyContractOnlineSigningNo("");
//			outputInvoiceIssueInvoiceSpecialInfo.setCarriageIdNo("");
//			outputInvoiceIssueInvoiceSpecialInfo.setTransport_arrive("");
//			outputInvoiceIssueInvoiceSpecialInfo.setLeaseCrossSign("");
//			outputInvoiceIssueInvoiceSpecialInfo.setBuildingLandTaxNo("");
//			outputInvoiceIssueInvoiceSpecialInfo.setPropertyPropertyNo("");
//			outputInvoiceIssueInvoiceSpecialInfo.setRegistrationNumber("");
//			outputInvoiceIssueInvoiceSpecialInfo.setTaxCollectedAmount(BigDecimal.valueOf(0.0));
//			outputInvoiceIssueInvoiceSpecialInfo.setCarriageArriveAddress("");
//			outputInvoiceIssueInvoiceSpecialInfo.setLeaseHoldDateStart("");
//			outputInvoiceIssueInvoiceSpecialInfo.setTransport_goods_name("");
//			invoiceSpecialInfoList.add(outputInvoiceIssueInvoiceSpecialInfo);
//			data.setInvoiceSpecialInfoList(invoiceSpecialInfoList);*/
//			// 备注 乐企长度为230个字符
//			if(invoiceResponseRequest.getRemark() != null){
//				data.setRemarks(invoiceResponseRequest.getRemark());
//			}
//			request.setData(data);
//			// 组织机构编码，如果为空则上传至税号对应的机构下，如果维护了机构则按照机构归属待开信息，
//			// 根据判断自行信息管理选择是否设置开票相关信息；根据组织机构编码获取销方信息
//			// request.setOrgCode("");
//			// 开具请求类型：isAsync 0 同步 1 异步 默认同步开具（仅支持rpa）
//			request.setIsAsync("0");
//			// 开票终端代码。服务器/税务ukey 用户专普票必填，电子票非必填；
//			// 税务ukey终端使用机器编号；盘用户，盘号终端选填，如果只有一个终端可不填，全电票种选填
//			// request.setInvoiceTerminalCode("dzpzd008");
//			// 税号
//			request.setTaxNo("91450821MABNPATY43");
//			// 版式生成是否推送(true / false)
//			request.setFormatPushType(true);
//			// 设备编号，即盘号，包括税控盘，航信盘，自持ukey。如果多个设备必填，只有一个终端可不填
//			// request.setTaxDiskNo("");
//			// 是否需要生成版式返回版式链接(true / false)
//			request.setFormatGenerate(true);
//			// 开票人，税票选填，取值逻辑：如果终端有值取终端，如果没有去机构获取，如果都没有会自动获取机构下随机用户名称；数电票Web连接器选填，
//			// 取值逻辑：taxUserName＞drawer＞默认开票人＞终端授权开票人，如果以上四处都未取到随机获取该税号下最近一次登录的数电账号对应的开票人；
//			// 数电票乐企连接器必填，长度最大300字符。
//			// request.setTaxUserName("cccccccb");
//
//			IBWClient client = new BWRestClient(url, appKey, appSecret); // 初始化一个客户端
//			// OutputInvoiceIssueResponse response = client.outputInvoice().issue(request, token);
//			// 重载方法，可以传自定义请求唯一标识
//			OutputInvoiceIssueResponse response = client.outputInvoice().issue(request, token, requestId);
//			System.out.println("百望云接口开具发票接口response："+response);
//
//			if(response.isSuccess()){
//				String url = response.getResponse().getSuccess().get(0).getEInvoiceUrl();
//				// 下载PDF文件
//				byte[] pdfBytes = downloadPdf(url);
//				// 将PDF的第一页转换为图片
//				BufferedImage image = convertPdfPageToImage(pdfBytes, 0);
//				// 图片转Base64
//				byte[] imageBytes = convertImageToBytes(image, "jpg");
//				String imageString = "data:image/jpeg;base64," + Base64.getEncoder().encodeToString(imageBytes);
//
//				LambdaQueryWrapper<NurseUserBillInvoice> invoiceLambdaQueryWrapper = new LambdaQueryWrapper<>();
//				invoiceLambdaQueryWrapper.eq(NurseUserBillInvoice::getOrderId, ordersDetail.getOrderId());
//				NurseUserBillInvoice invoice = nurseUserBillInvoiceMapper.selectOne(invoiceLambdaQueryWrapper);
//				// 修改电子发票表的状态
//				NurseUserBillInvoice update = new NurseUserBillInvoice();
//				update.setId(invoice.getId());
//				// update.setCheckCode("");
//				update.setUrl(url);
//				update.setPic(imageString);
//				update.setUpdateBy(ordersDetail.getCreateBy());
//				update.setUpdateTime(new Date());
//				update.setStatus("2");
//				nurseUserBillInvoiceMapper.updateById(update);
//			} else {
//				String subMessage = response.getErrorResponse().getSubMessage();
//				throw new JeecgBootException(subMessage);
//			}
//		} catch (BWOpenException e) {
//			if(e.getMessage().contains("70031")){
//				throw new JeecgBootException(e.getSubMessage());
//			}
//			if(e.getMessage().contains("70045")){
//				throw new JeecgBootException(e.getSubMessage());
//			}
//			throw new JeecgBootException("百望云接口开具发票接口报错，请检查" + e.getSubMessage());
//		} catch (Exception e) {
//			log.error("百望云接口开具发票接口报错");
//		}
        return null;
    }

    public byte[] downloadPdf(String url) throws Exception {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try {
            URL urlObj = new URL(url);
            HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();
            InputStream in = con.getInputStream();
            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = in.read(buffer)) != -1) {
                baos.write(buffer, 0, bytesRead);
            }
        } catch (Exception e) {
            throw new JeecgBootException(e.getMessage());
        }
        return baos.toByteArray();
    }

    private BufferedImage convertPdfPageToImage(byte[] pdfBytes, int pageNumber) throws IOException {
        try (PDDocument document = PDDocument.load(new ByteArrayInputStream(pdfBytes))) {
            if (document.getNumberOfPages() > pageNumber) {
                PDFRenderer renderer = new PDFRenderer(document);
                return renderer.renderImageWithDPI(pageNumber, 500, ImageType.RGB);
            } else {
                throw new IllegalArgumentException("PDF does not contain enough pages.");
            }
        }
    }


    // 将图片转换为字节数组
    private static byte[] convertImageToBytes(BufferedImage image, String formatName) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(image, formatName, baos);
        return baos.toByteArray();
    }

    @Override
    public String redElectronicInvoice(String orderId) {
        return null;
    }
}
